package com.yangrong.thread.chapter3;

public class VolatileTest {

//	private static int INIT_VALUE = 0;
	private static volatile int INIT_VALUE = 0;

	private final static int MAX_LIMIT = 5;

	public static void main(String[] args) {
		new Thread(() -> {
			int localValue = INIT_VALUE;
			while (localValue < MAX_LIMIT) {
				// INIT_VALUE不更新，一方面是由于JVM的内存模型，线程有自己的工作内存，有一份变量的拷贝
				// 另一方面由于Java优化导致，线程中这里未对INIT_VALUE进行值的修改操作，因此不会从主存中同步变量的最新值
				// 参考VolatileTest1.java中，两线程均对变量进行修改，因此在线程执行中空闲时会从主存中同步变量的值
				if (localValue != INIT_VALUE) {
					System.out.printf("The value updated to [%d]\n", INIT_VALUE);
					localValue = INIT_VALUE;
				}
			}
		}, "READER").start();

		new Thread(() -> {
			int localValue = INIT_VALUE;
			while (INIT_VALUE < MAX_LIMIT) {
				System.out.printf("Update the value to [%d]\n", ++localValue);
				INIT_VALUE = localValue;
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}, "UPDATER").start();
	}

}
